package org.stone.project.saToken.config;

import cn.dev33.satoken.interceptor.SaInterceptor;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.ObjectUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.stone.project.webIntegration.pojo.prop.WhiteUrlProp;

import java.util.List;
import java.util.stream.Collectors;

@Configuration
public class SaTokenConfig implements WebMvcConfigurer {
    @Autowired
    private WhiteUrlProp whiteUrlProp;

    @Autowired
    private ServerProperties serverProperties;

    // 注册拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        List<String> urls = null;
        if (ObjectUtil.isNotEmpty(serverProperties.getServlet().getContextPath())){
            urls = whiteUrlProp.getUrls().stream().map(ele -> serverProperties.getServlet().getContextPath() + ele).collect(Collectors.toList());
        }else {
            urls = whiteUrlProp.getUrls();
        }

        // 注册 Sa-Token 拦截器，校验规则为 StpUtil.checkLogin() 登录校验。
        List<String> finalUrls = urls;
        registry.addInterceptor(new SaInterceptor(handler -> {
                    // 指定一条 match 规则
                    //todo 校验是否真的登录成功标识
                    SaRouter
                            .match("/**")                    // 拦截的 path 列表，可以写多个 */
                            .notMatch(finalUrls)                      // 排除掉的 path 列表，可以写多个
                            .check(r -> {
                                StpUtil.checkLogin();
                            });        // 要执行的校验动作，可以写完整的 lambda 表达式
                }))
                .addPathPatterns("/**")
                .excludePathPatterns(finalUrls);
    }
}
